package com.ruoyi.exam.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.exam.domain.ExamRandomPractice;
import com.ruoyi.exam.vo.ExamRandomPracticeVo;
import com.ruoyi.exam.vo.ExamRandomPracticeQuestionIdsVo;
import com.ruoyi.exam.vo.ExamQuestionDetailVo;
import com.ruoyi.exam.vo.SubmitAnswerVo;
import com.ruoyi.exam.vo.SubmitAnswerResultVo;

import java.util.List;

/**
 * 练习Service接口
 *
 * @author Tellsea
 * @date 2025-07-28
 */
public interface IExamRandomPracticeService extends IService<ExamRandomPractice> {

    /**
     * 分页查询
     *
     * @param entity
     * @return
     */
    TableDataInfo<ExamRandomPracticeVo> queryList(ExamRandomPracticeVo entity);

    /**
     * 查询全部
     *
     * @param entity
     * @return
     */
    List<ExamRandomPracticeVo> queryAll(ExamRandomPracticeVo entity);

    /**
     * 根据ID查询
     *
     * @param practiceId
     * @return
     */
    ExamRandomPracticeVo queryById(Long practiceId);

    /**
     * 创建随机练习
     *
     * @param bankId 题库ID
     * @param questionType 题目类型（1单选 2多选 3判断）
     * @param userId 用户ID
     * @return 练习信息
     */
    ExamRandomPracticeVo createRandomPractice(Long bankId, String questionType, Long userId);

    /**
     * 检查用户是否有未完成的练习
     *
     * @param bankId 题库ID
     * @param questionType 题目类型
     * @param userId 用户ID
     * @return 未完成的练习信息，如果没有则返回null
     */
    ExamRandomPracticeVo checkUnfinishedPractice(Long bankId, String questionType, Long userId);

    /**
     * 获取随机练习的题目ID列表
     *
     * @param practiceId 练习ID
     * @return 包含题目ID列表、第一个未答题ID和索引的对象
     */
    ExamRandomPracticeQuestionIdsVo getQuestionIds(Long practiceId);

    /**
     * 重新练习
     * 删除当前用户当前题库下的该种题目的所有随机练习和练习题目数据，并创建新的随机练习
     *
     * @param bankId 题库ID
     * @param questionType 题目类型
     * @param userId 用户ID
     * @return 新建的随机练习对象
     */
    ExamRandomPracticeVo restartPractice(Long bankId, String questionType, Long userId);

    /**
     * 获取随机练习题目详细信息
     * 包含题目、选项、答案、解析以及该题目在练习中的答题状态
     *
     * @param practiceId 练习ID
     * @param questionId 题目ID
     * @param userId 用户ID
     * @return 题目详细信息
     */
    ExamQuestionDetailVo queryQuestionDetail(Long practiceId, Long questionId, Long userId);

    /**
     * 提交随机练习答案
     *
     * @param submitAnswerVo 提交答案的请求信息（需包含practiceId）
     * @param userId 用户ID
     * @return 提交结果
     */
    SubmitAnswerResultVo submitAnswer(SubmitAnswerVo submitAnswerVo, Long userId);

    /**
     * 完成练习
     * 将指定练习的状态更新为已完成
     *
     * @param practiceId 练习ID
     * @param userId 用户ID
     * @return 更新后的练习信息
     */
    ExamRandomPracticeVo completePractice(Long practiceId, Long userId);
}
